package com.leetcode.algo;

/**
 *
 * 给你一个整数 x ，如果 x 是一个回文整数，返回 true ；否则，返回 false 。
 *
 * 回文数是指正序（从左向右）和倒序（从右向左）读都是一样的整数。
 *
 * 例如，121 是回文，而 123 不是。
 * 示例 1：
 *
 * 输入：x = 121
 * 输出：true
 * 示列2：
 *
 * 输入：x = -121
 * 输出：false
 * 解释：从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
 * 示例 3：
 *
 * 输入：x = 10
 * 输出：false
 * 解释：从右向左读, 为 01 。因此它不是一个回文数。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/palindrome-number
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Algo9 {

    /**
     *
     * 暴力解法
     * 执行用时:6 ms 54.77%
     * 内存消耗：40.6 MB 18.69%
     * 有点慢，想想为啥？ 输入是数字，其实可以用数值判断是否等于，不需要转成字符串
     * @param x
     * @return
     */
    public boolean isPalindrome(int x) {

        if( x < 0 ) {
            return false;
        }
        String str = String.valueOf(x);

        int begin = 0;
        int end = str.length() - 1;

        boolean flag = true;
        while (begin != end & end > begin) {
            if (str.charAt(begin) != str.charAt(end)) {
                flag = false;
                return flag;
            }
            begin++;
            end--;
        }
        return flag;
    }

    /**
     * 反转一半数值，与另一半是否相等
     */
    public boolean isPalindrome2(int x) {

        if( x < 0 ) {
            return false;
        }

        String str = String.valueOf(x);
        int length = str.length();
        if (length == 1) {
            return true;
        }
        if (length % 2 == 1) {
            // 奇位数
            int beginHalf = Integer.parseInt(str.substring(0, length/2));
            int endHalf = Integer.parseInt(new StringBuilder(str.substring((length/2) + 1, length)).reverse().toString());
            System.out.println("beginHalf:" + beginHalf);
            System.out.println("endHalf:" + endHalf);

            if (beginHalf == endHalf) {
                return true;
            }else {
                return false;
            }

        }else {
            int beginHalf = Integer.parseInt(str.substring(0, length/2));
            int endHalf = Integer.parseInt(new StringBuilder(str.substring((length/2), length)).reverse().toString());
            System.out.println("beginHalf:" + beginHalf);
            System.out.println("endHalf:" + endHalf);

            if (beginHalf == endHalf) {
                return true;
            }else {
                return false;
            }
        }
    }

    public boolean isPalindrome3(int x) {
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }
        int revertedNumber = 0;
        while(x > revertedNumber) {
            revertedNumber = revertedNumber*10 + x%10;
            x = x/10;
        }
        return x == revertedNumber || x == revertedNumber / 10;
    }

    public static void main(String[] args) {
        Algo9 algo9 = new Algo9();

//        System.out.println(algo9.isPalindrome(12343321));
        System.out.println(algo9.isPalindrome2(1233321));
    }
}
